package com.rayframework.beans.factory;

/**
 * IOC容器父接口
 * BeanFactory为Ray的“心脏”
 *
 * @author LiaoYuXing-Ray
 * @version 1.0
 * @createDate 2023/11/24 11:42
 **/
public interface BeanFactory {
    /**
     * 根据Bean名称获取的实例对象
     *
     * @param beanName 需要获取的Bean的名称
     * @return java.lang.Object 返回Bean的实例化的该对象
     * @author LiaoYuXing-Ray 2023/9/20 11:49
     **/
    Object getBean(String beanName) throws Exception;

    /**
     * 根据Bean名称获取Bean对象的类型获取Bean对象
     * 防止强制类型转化
     *
     * @param name  Bean名称
     * @param clazz Bean对象类
     * @return T
     * @author LiaoYuXing-Ray 2023/11/24 16:54
     **/
    <T> T getBean(String name, Class<? extends T> clazz) throws Exception;

    /**
     * 检查容器中是否包含指定类型的Bean
     *
     * @param clazz 需要查询的类Class对象
     * @return 是否包含
     * @author LiaoYuXing-Ray 2023/9/20 11:50
     **/
    boolean containsBean(Class<?> clazz);

    /**
     * 检查容器中是否包含指定名称的Bean
     *
     * @param beanName Bean的名称
     * @return 是否包含
     * @author LiaoYuXing-Ray 2023/9/20 11:50
     **/
    boolean containsBean(String beanName);
}
